package main

import "fmt"
/*
	两整数之和
不使用运算符 + 和 - ​​​​​​​，计算两整数 ​​​​​​​a 、b ​​​​​​​之和。

示例 1:
输入: a = 1, b = 2
输出: 3

示例 2:
输入: a = -2, b = 3
输出: 1
 */

/*
1、二进制位异或运算相当于对应位相加，不考虑进位
	比如： 1 ^ 1 = 0 ---> 1 + 1 = 0 (当前位值为0，进一位)
	1 ^ 0 = 1 ---> 1 + 0 = 1 (当前位值为1)
	0 ^ 0 = 0 ---> 0 + 0 = 0 (当前位值为0)
2、二进制位与运算相当于对应位相加之后的进位
	比如： 1 & 1 = 1 ---> 1 + 1 = 0 (当前位的值进一位)
	1 & 0 = 0 ---> 1 + 0 = 1 (当前位的值不进位)
	0 & 0 = 0 ---> 0 + 0 = 0 (当前位的值不进位)
3、两个数相加：对应二进制位相加的结果 + 进位的结果
	比如：3 + 2 --> 0011 + 0010
	0011 ^ 0010 = 0001
	0011 & 0010 = 0010 需要进位变成 0100 也就是<<1
当进位之后的结果为0时，相加结束。

 */

func getSum(a int, b int) int {
	for b != 0 {
		sum := a ^ b
		carry := (a & b) << 1
		a = sum
		b = carry
	}
	return a
}

func main() {
	fmt.Println(getSum(10,11))
}
